package com.sqlcheck.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 任务状态枚举
 * 
 * @author Claude Code
 * @since 2025-09-04
 */
@Getter
public enum TaskStatus {
    
    /** 待执行 - 任务已创建但尚未开始 */
    PENDING("PENDING", "待执行", "任务已创建，等待开始执行"),
    
    /** 执行中 - 任务正在执行 */
    RUNNING("RUNNING", "执行中", "任务正在执行中"),
    
    /** 执行成功 - 任务已完成且成功 */
    SUCCESS("SUCCESS", "执行成功", "任务已成功完成"),
    
    /** 执行失败 - 任务执行失败 */
    FAILED("FAILED", "执行失败", "任务执行过程中出现错误"),
    
    /** 已取消 - 任务被用户取消 */
    CANCELLED("CANCELLED", "已取消", "任务被用户主动取消");

    /** 数据库存储值 */
    @EnumValue
    private final String code;
    
    /** 显示名称 */
    private final String displayName;
    
    /** 状态描述 */
    private final String description;
    
    TaskStatus(String code, String displayName, String description) {
        this.code = code;
        this.displayName = displayName;
        this.description = description;
    }
    
    /**
     * JSON序列化时使用的值
     */
    @JsonValue
    public String getCode() {
        return code;
    }
    
    /**
     * 根据代码获取枚举
     */
    public static TaskStatus fromCode(String code) {
        if (code == null) {
            return null;
        }
        
        for (TaskStatus status : values()) {
            if (status.code.equals(code)) {
                return status;
            }
        }
        
        throw new IllegalArgumentException("未知的任务状态: " + code);
    }
    
    /**
     * 检查是否为终态（不会再变更的状态）
     */
    public boolean isFinalState() {
        return this == SUCCESS || this == FAILED || this == CANCELLED;
    }
    
    /**
     * 检查是否为可执行状态
     */
    public boolean isExecutable() {
        return this == PENDING;
    }
    
    /**
     * 检查是否为活跃状态（正在执行或等待执行）
     */
    public boolean isActive() {
        return this == PENDING || this == RUNNING;
    }
    
    /**
     * 检查是否可以重试
     */
    public boolean canRetry() {
        return this == FAILED;
    }
    
    /**
     * 检查是否可以取消
     */
    public boolean canCancel() {
        return this == PENDING || this == RUNNING;
    }
    
    /**
     * 获取状态对应的进度值
     */
    public int getDefaultProgress() {
        switch (this) {
            case PENDING:
                return 0;
            case RUNNING:
                return -1; // 运行中进度由具体任务更新
            case SUCCESS:
                return 100;
            case FAILED:
            case CANCELLED:
                return 0;
            default:
                return 0;
        }
    }
}